{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2fdb4210",
   "metadata": {
    "papermill": {
     "duration": 0.005489,
     "end_time": "2025-03-19T15:03:32.740227",
     "exception": false,
     "start_time": "2025-03-19T15:03:32.734738",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "**This notebook is an exercise in the [Feature Engineering](https://www.kaggle.com/learn/feature-engineering) course.  You can reference the tutorial at [this link](https://www.kaggle.com/ryanholbrook/target-encoding).**\n",
    "\n",
    "---\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c14d69d4",
   "metadata": {
    "papermill": {
     "duration": 0.004521,
     "end_time": "2025-03-19T15:03:32.749795",
     "exception": false,
     "start_time": "2025-03-19T15:03:32.745274",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Introduction #\n",
    "\n",
    "In this exercise, you'll apply target encoding to features in the [*Ames*](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data) dataset.\n",
    "\n",
    "Run this cell to set everything up!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5934c52c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:32.760426Z",
     "iopub.status.busy": "2025-03-19T15:03:32.760026Z",
     "iopub.status.idle": "2025-03-19T15:03:36.244477Z",
     "shell.execute_reply": "2025-03-19T15:03:36.243408Z"
    },
    "papermill": {
     "duration": 3.491976,
     "end_time": "2025-03-19T15:03:36.246454",
     "exception": false,
     "start_time": "2025-03-19T15:03:32.754478",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-1-15b3a7c69be6>:16: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.\n",
      "  plt.style.use(\"seaborn-whitegrid\")\n"
     ]
    }
   ],
   "source": [
    "# Setup feedback system\n",
    "from learntools.core import binder\n",
    "binder.bind(globals())\n",
    "from learntools.feature_engineering_new.ex6 import *\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "import warnings\n",
    "from category_encoders import MEstimateEncoder\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from xgboost import XGBRegressor\n",
    "\n",
    "# Set Matplotlib defaults\n",
    "plt.style.use(\"seaborn-whitegrid\")\n",
    "plt.rc(\"figure\", autolayout=True)\n",
    "plt.rc(\n",
    "    \"axes\",\n",
    "    labelweight=\"bold\",\n",
    "    labelsize=\"large\",\n",
    "    titleweight=\"bold\",\n",
    "    titlesize=14,\n",
    "    titlepad=10,\n",
    ")\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "\n",
    "def score_dataset(X, y, model=XGBRegressor()):\n",
    "    # Label encoding for categoricals\n",
    "    for colname in X.select_dtypes([\"category\", \"object\"]):\n",
    "        X[colname], _ = X[colname].factorize()\n",
    "    # Metric for Housing competition is RMSLE (Root Mean Squared Log Error)\n",
    "    score = cross_val_score(\n",
    "        model, X, y, cv=5, scoring=\"neg_mean_squared_log_error\",\n",
    "    )\n",
    "    score = -1 * score.mean()\n",
    "    score = np.sqrt(score)\n",
    "    return score\n",
    "\n",
    "\n",
    "df = pd.read_csv(\"../input/fe-course-data/ames.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ccba19b",
   "metadata": {
    "papermill": {
     "duration": 0.004721,
     "end_time": "2025-03-19T15:03:36.256596",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.251875",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "-------------------------------------------------------------------------------\n",
    "\n",
    "First you'll need to choose which features you want to apply a target encoding to. Categorical features with a large number of categories are often good candidates. Run this cell to see how many categories each categorical feature in the *Ames* dataset has."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ea7ead84",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.267712Z",
     "iopub.status.busy": "2025-03-19T15:03:36.267286Z",
     "iopub.status.idle": "2025-03-19T15:03:36.293506Z",
     "shell.execute_reply": "2025-03-19T15:03:36.292457Z"
    },
    "papermill": {
     "duration": 0.033684,
     "end_time": "2025-03-19T15:03:36.295144",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.261460",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MSSubClass       16\n",
       "MSZoning          7\n",
       "Street            2\n",
       "Alley             3\n",
       "LotShape          4\n",
       "LandContour       4\n",
       "Utilities         3\n",
       "LotConfig         5\n",
       "LandSlope         3\n",
       "Neighborhood     28\n",
       "Condition1        9\n",
       "Condition2        8\n",
       "BldgType          5\n",
       "HouseStyle        8\n",
       "OverallQual      10\n",
       "OverallCond       9\n",
       "RoofStyle         6\n",
       "RoofMatl          8\n",
       "Exterior1st      16\n",
       "Exterior2nd      17\n",
       "MasVnrType        4\n",
       "ExterQual         4\n",
       "ExterCond         5\n",
       "Foundation        6\n",
       "BsmtQual          6\n",
       "BsmtCond          6\n",
       "BsmtExposure      5\n",
       "BsmtFinType1      7\n",
       "BsmtFinType2      7\n",
       "Heating           6\n",
       "HeatingQC         5\n",
       "CentralAir        2\n",
       "Electrical        6\n",
       "KitchenQual       5\n",
       "Functional        8\n",
       "FireplaceQu       6\n",
       "GarageType        7\n",
       "GarageFinish      4\n",
       "GarageQual        6\n",
       "GarageCond        6\n",
       "PavedDrive        3\n",
       "PoolQC            5\n",
       "Fence             5\n",
       "MiscFeature       5\n",
       "SaleType         10\n",
       "SaleCondition     6\n",
       "dtype: int64"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.select_dtypes([\"object\"]).nunique()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "521434b7",
   "metadata": {
    "papermill": {
     "duration": 0.004782,
     "end_time": "2025-03-19T15:03:36.305267",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.300485",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "We talked about how the M-estimate encoding uses smoothing to improve estimates for rare categories. To see how many times a category occurs in the dataset, you can use the `value_counts` method. This cell shows the counts for `SaleType`, but you might want to consider others as well."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f1df1447",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.316487Z",
     "iopub.status.busy": "2025-03-19T15:03:36.316125Z",
     "iopub.status.idle": "2025-03-19T15:03:36.325717Z",
     "shell.execute_reply": "2025-03-19T15:03:36.324710Z"
    },
    "papermill": {
     "duration": 0.017106,
     "end_time": "2025-03-19T15:03:36.327456",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.310350",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SaleType\n",
       "WD       2536\n",
       "New       239\n",
       "COD        87\n",
       "ConLD      26\n",
       "CWD        12\n",
       "ConLI       9\n",
       "ConLw       8\n",
       "Oth         7\n",
       "Con         5\n",
       "VWD         1\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"SaleType\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5161f67d",
   "metadata": {
    "papermill": {
     "duration": 0.005101,
     "end_time": "2025-03-19T15:03:36.337966",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.332865",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# 1) Choose Features for Encoding\n",
    "\n",
    "Which features did you identify for target encoding? After you've thought about your answer, run the next cell for some discussion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "17a9896a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.349397Z",
     "iopub.status.busy": "2025-03-19T15:03:36.349010Z",
     "iopub.status.idle": "2025-03-19T15:03:36.355733Z",
     "shell.execute_reply": "2025-03-19T15:03:36.354800Z"
    },
    "papermill": {
     "duration": 0.014075,
     "end_time": "2025-03-19T15:03:36.357173",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.343098",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"outcomeType\": 1, \"valueTowardsCompletion\": 0.3333333333333333, \"interactionType\": 1, \"questionType\": 4, \"questionId\": \"1_Q1\", \"learnToolsVersion\": \"0.3.4\", \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\"}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc33\">Correct:</span> \n",
       "\n",
       " The `Neighborhood` feature looks promising. It has the most categories of any feature, and several categories are rare. Others that could be worth considering are `SaleType`, `MSSubClass`, `Exterior1st`, `Exterior2nd`. In fact, almost any of the nominal features would be worth trying because of the prevalence of rare categories."
      ],
      "text/plain": [
       "Correct: \n",
       "\n",
       " The `Neighborhood` feature looks promising. It has the most categories of any feature, and several categories are rare. Others that could be worth considering are `SaleType`, `MSSubClass`, `Exterior1st`, `Exterior2nd`. In fact, almost any of the nominal features would be worth trying because of the prevalence of rare categories."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# View the solution (Run this cell to receive credit!)\n",
    "q_1.check()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e57113f",
   "metadata": {
    "papermill": {
     "duration": 0.005178,
     "end_time": "2025-03-19T15:03:36.367985",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.362807",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "-------------------------------------------------------------------------------\n",
    "\n",
    "Now you'll apply a target encoding to your choice of feature. As we discussed in the tutorial, to avoid overfitting, we need to fit the encoder on data heldout from the training set. Run this cell to create the encoding and training splits:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "20cf7c2c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.379964Z",
     "iopub.status.busy": "2025-03-19T15:03:36.379611Z",
     "iopub.status.idle": "2025-03-19T15:03:36.393625Z",
     "shell.execute_reply": "2025-03-19T15:03:36.392691Z"
    },
    "lines_to_next_cell": 2,
    "papermill": {
     "duration": 0.02206,
     "end_time": "2025-03-19T15:03:36.395413",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.373353",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Encoding split\n",
    "X_encode = df.sample(frac=0.20, random_state=0)\n",
    "y_encode = X_encode.pop(\"SalePrice\")\n",
    "\n",
    "# Training split\n",
    "X_pretrain = df.drop(X_encode.index)\n",
    "y_train = X_pretrain.pop(\"SalePrice\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bcdbbec7",
   "metadata": {
    "papermill": {
     "duration": 0.005159,
     "end_time": "2025-03-19T15:03:36.406400",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.401241",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# 2) Apply M-Estimate Encoding\n",
    "\n",
    "Apply a target encoding to your choice of categorical features. Also choose a value for the smoothing parameter `m` (any value is okay for a correct answer)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "08ca8eed",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.418319Z",
     "iopub.status.busy": "2025-03-19T15:03:36.417969Z",
     "iopub.status.idle": "2025-03-19T15:03:36.481496Z",
     "shell.execute_reply": "2025-03-19T15:03:36.480513Z"
    },
    "lines_to_next_cell": 0,
    "papermill": {
     "duration": 0.071162,
     "end_time": "2025-03-19T15:03:36.482937",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.411775",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"outcomeType\": 1, \"valueTowardsCompletion\": 0.3333333333333333, \"interactionType\": 1, \"questionType\": 2, \"questionId\": \"2_Q2\", \"learnToolsVersion\": \"0.3.4\", \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\"}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc33\">Correct</span>"
      ],
      "text/plain": [
       "Correct"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# YOUR CODE HERE: Create the MEstimateEncoder\n",
    "# Choose a set of features to encode and a value for m\n",
    "encoder = MEstimateEncoder(\n",
    "    cols = [\"Neighborhood\"],\n",
    "    m=1.0,\n",
    ")\n",
    "\n",
    "\n",
    "# Fit the encoder on the encoding split\n",
    "encoder.fit(X_encode, y_encode)\n",
    "\n",
    "# Encode the training split\n",
    "X_train = encoder.transform(X_pretrain, y_train)\n",
    "\n",
    "\n",
    "# Check your answer\n",
    "q_2.check()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b69d7197",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.495163Z",
     "iopub.status.busy": "2025-03-19T15:03:36.494863Z",
     "iopub.status.idle": "2025-03-19T15:03:36.504430Z",
     "shell.execute_reply": "2025-03-19T15:03:36.503420Z"
    },
    "lines_to_next_cell": 0,
    "papermill": {
     "duration": 0.017358,
     "end_time": "2025-03-19T15:03:36.505980",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.488622",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"interactionType\": 2, \"questionType\": 2, \"questionId\": \"2_Q2\", \"learnToolsVersion\": \"0.3.4\", \"valueTowardsCompletion\": 0.0, \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\", \"outcomeType\": 4}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#3366cc\">Hint:</span> Your code should look something like:\n",
       "```python\n",
       "encoder = MEstimateEncoder(\n",
       "    cols=____,\n",
       "    m=____,\n",
       ")\n",
       "\n",
       "\n",
       "# Fit the encoder on the encoding split\n",
       "____.____(X_encode, y_encode)\n",
       "\n",
       "# Encode the training split\n",
       "X_train = encoder.transform(X_pretrain, y_train)\n",
       "```\n"
      ],
      "text/plain": [
       "Hint: Your code should look something like:\n",
       "```python\n",
       "encoder = MEstimateEncoder(\n",
       "    cols=____,\n",
       "    m=____,\n",
       ")\n",
       "\n",
       "\n",
       "# Fit the encoder on the encoding split\n",
       "____.____(X_encode, y_encode)\n",
       "\n",
       "# Encode the training split\n",
       "X_train = encoder.transform(X_pretrain, y_train)\n",
       "```"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"interactionType\": 3, \"questionType\": 2, \"questionId\": \"2_Q2\", \"learnToolsVersion\": \"0.3.4\", \"valueTowardsCompletion\": 0.0, \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\", \"outcomeType\": 4}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc99\">Solution:</span> \n",
       "```python\n",
       "\n",
       "encoder = MEstimateEncoder(\n",
       "    cols=[\"Neighborhood\"],\n",
       "    m=1.0,\n",
       ")\n",
       "\n",
       "\n",
       "# Fit the encoder on the encoding split\n",
       "encoder.fit(X_encode, y_encode)\n",
       "\n",
       "# Encode the training split\n",
       "X_train = encoder.transform(X_pretrain, y_train)\n",
       "\n",
       "```"
      ],
      "text/plain": [
       "Solution: \n",
       "```python\n",
       "\n",
       "encoder = MEstimateEncoder(\n",
       "    cols=[\"Neighborhood\"],\n",
       "    m=1.0,\n",
       ")\n",
       "\n",
       "\n",
       "# Fit the encoder on the encoding split\n",
       "encoder.fit(X_encode, y_encode)\n",
       "\n",
       "# Encode the training split\n",
       "X_train = encoder.transform(X_pretrain, y_train)\n",
       "\n",
       "```"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Lines below will give you a hint or solution code\n",
    "q_2.hint()\n",
    "q_2.solution()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "353f77d1",
   "metadata": {
    "papermill": {
     "duration": 0.005786,
     "end_time": "2025-03-19T15:03:36.517850",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.512064",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "If you'd like to see how the encoded feature compares to the target, you can run this cell:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4265ae4c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:36.530838Z",
     "iopub.status.busy": "2025-03-19T15:03:36.530515Z",
     "iopub.status.idle": "2025-03-19T15:03:37.049098Z",
     "shell.execute_reply": "2025-03-19T15:03:37.048029Z"
    },
    "papermill": {
     "duration": 0.526935,
     "end_time": "2025-03-19T15:03:37.050665",
     "exception": false,
     "start_time": "2025-03-19T15:03:36.523730",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "feature = encoder.cols\n",
    "\n",
    "plt.figure(dpi=90)\n",
    "ax = sns.distplot(y_train, kde=True, hist=False)\n",
    "ax = sns.distplot(X_train[feature], color='r', ax=ax, hist=True, kde=False, norm_hist=True)\n",
    "ax.set_xlabel(\"SalePrice\");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5eac9750",
   "metadata": {
    "papermill": {
     "duration": 0.006909,
     "end_time": "2025-03-19T15:03:37.064502",
     "exception": false,
     "start_time": "2025-03-19T15:03:37.057593",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "From the distribution plots, does it seem like the encoding is informative?\n",
    "\n",
    "And this cell will show you the score of the encoded set compared to the original set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a290c2d9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:37.079249Z",
     "iopub.status.busy": "2025-03-19T15:03:37.078928Z",
     "iopub.status.idle": "2025-03-19T15:03:40.643463Z",
     "shell.execute_reply": "2025-03-19T15:03:40.642532Z"
    },
    "papermill": {
     "duration": 3.573686,
     "end_time": "2025-03-19T15:03:40.645125",
     "exception": false,
     "start_time": "2025-03-19T15:03:37.071439",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Baseline Score: 0.1434 RMSLE\n",
      "Score with Encoding: 0.1434 RMSLE\n"
     ]
    }
   ],
   "source": [
    "X = df.copy()\n",
    "y = X.pop(\"SalePrice\")\n",
    "score_base = score_dataset(X, y)\n",
    "score_new = score_dataset(X_train, y_train)\n",
    "\n",
    "print(f\"Baseline Score: {score_base:.4f} RMSLE\")\n",
    "print(f\"Score with Encoding: {score_new:.4f} RMSLE\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e73790b",
   "metadata": {
    "papermill": {
     "duration": 0.006373,
     "end_time": "2025-03-19T15:03:40.658430",
     "exception": false,
     "start_time": "2025-03-19T15:03:40.652057",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Do you think that target encoding was worthwhile in this case? Depending on which feature or features you chose, you may have ended up with a score significantly worse than the baseline. In that case, it's likely the extra information gained by the encoding couldn't make up for the loss of data used for the encoding."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b9d7594",
   "metadata": {
    "papermill": {
     "duration": 0.006263,
     "end_time": "2025-03-19T15:03:40.671148",
     "exception": false,
     "start_time": "2025-03-19T15:03:40.664885",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "-------------------------------------------------------------------------------\n",
    "\n",
    "In this question, you'll explore the problem of overfitting with target encodings. This will illustrate this importance of training fitting target encoders on data held-out from the training set.\n",
    "\n",
    "So let's see what happens when we fit the encoder and the model on the *same* dataset. To emphasize how dramatic the overfitting can be, we'll mean-encode a feature that should have no relationship with `SalePrice`, a count: `0, 1, 2, 3, 4, 5, ...`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "72aa3cd5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:40.685820Z",
     "iopub.status.busy": "2025-03-19T15:03:40.685473Z",
     "iopub.status.idle": "2025-03-19T15:03:42.331218Z",
     "shell.execute_reply": "2025-03-19T15:03:42.330394Z"
    },
    "papermill": {
     "duration": 1.654773,
     "end_time": "2025-03-19T15:03:42.332764",
     "exception": false,
     "start_time": "2025-03-19T15:03:40.677991",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Score: 0.0375 RMSLE\n"
     ]
    }
   ],
   "source": [
    "# Try experimenting with the smoothing parameter m\n",
    "# Try 0, 1, 5, 50\n",
    "m = 0\n",
    "\n",
    "X = df.copy()\n",
    "y = X.pop('SalePrice')\n",
    "\n",
    "# Create an uninformative feature\n",
    "X[\"Count\"] = range(len(X))\n",
    "X[\"Count\"][1] = 0  # actually need one duplicate value to circumvent error-checking in MEstimateEncoder\n",
    "\n",
    "# fit and transform on the same dataset\n",
    "encoder = MEstimateEncoder(cols=\"Count\", m=m)\n",
    "X = encoder.fit_transform(X, y)\n",
    "\n",
    "# Results\n",
    "score =  score_dataset(X, y)\n",
    "print(f\"Score: {score:.4f} RMSLE\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ac90876",
   "metadata": {
    "papermill": {
     "duration": 0.006972,
     "end_time": "2025-03-19T15:03:42.346687",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.339715",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Almost a perfect score!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "4edf5f4e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:42.360811Z",
     "iopub.status.busy": "2025-03-19T15:03:42.360490Z",
     "iopub.status.idle": "2025-03-19T15:03:42.698569Z",
     "shell.execute_reply": "2025-03-19T15:03:42.697537Z"
    },
    "papermill": {
     "duration": 0.346897,
     "end_time": "2025-03-19T15:03:42.700064",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.353167",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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kJGRwa9//WtuvfVWUlJSCAaDPPPMM7z55pu0a3foBnxN38/6+vqo3neyFG5OUWs3JZTIKSgo4LbbbuOuu+7iu9/9Ln/961+PeU1M04zqfXJsixYtoqysjOnTpx9y+/F+pnT9Ykt2djapqalceeWVAEycOJHu3bvjcrl0DePAhg0bePDBB5k/fz59+vShoKCAW265hQsvvPCo38/09PRj/nxG6r6TpWmpU9S3b98jhs4KCwvp37+/RRUllw0bNjBr1ix++9vfcvXVVwPHvybRvk+O7f3332f79u1MmjSJCy+8kA8++IBHHnmEf//737p+caJHjx40NDQ07ygPoSmFzp076xrGgWXLljFixAj69OkDhFYyd+rUiW7durF9+/bmj/P5fOzcuZN+/frRp0+fqN53shRuTlHLTQmBY25KKOHn9/uZPXs299133yGHrh7vmkT7Pjm2Rx99lM8++4zFixezePFiLr74YubMmcOrr76q6xcn+vXrx7Bhw3j55ZeBUN9bcXGxfgbjRP/+/VmzZg179uwBQoGwuLiYs88+m4KCAtasWQPA3//+d/r370+fPn2YMmVKVO87aae01kpM0zTNb775xpw2bZo5efJk85prrjELCgqsLikpfPLJJ+agQYPMiy+++JC3BQsWHPeaRPs+aZ05c+aY8+bNM00z+tdI1+/kFRYWmtOnTzcvuOAC8zvf+Y65ZMkS0zR1DePF3LlzzSlTpphTpkwxL730UvOtt94yTdM0P/74Y/Pyyy83J0+ebN54441mUVFR8+dE+76TYckOxSIiIiKRomkpERERSSgKNyIiIpJQFG5EREQkoSjciIiISEJRuBEREZGEonAjIiIiCUXhRkRERBKKwo2IRMU999zDoEGDePPNN6PyfMuXL2fQoEHceOONUXk+EYkdOjhTRE6orq6OuXPn8uGHH7J79258Ph+dOnXinHPO4e677yYzMzPsz7lz504mTZp0yG2GYZCTk8PEiRO588476dq16zE/v0+fPvz2t7+lQ4cOYa9NRGKbwo2InNCsWbP44osvOP3005k+fTo+n4958+bx+uuvs2PHDl566aWIPv+DDz6Iw+HA4/Hw8ccfM3/+fL744gvef//9Y5783LFjR6699tqI1iUisUnhRkSOq7y8nC+++AKAJ554onkk5LLLLuPJJ5+ke/fu+Hw+du/ezR//+Efy8/Opq6ujf//+zJ49m/Hjxx/zsZcsWcLcuXPZuHEjDoeDSZMmce+99x4xEjRt2jTcbjcA06dP54ILLmDPnj2sXr2anj17MmnSJNq1a8c999zD7373O+6880769+/PjBkzGDduHH//+98BqKio4NFHH2Xx4sXU19fTr18/Zs2a1TxCZJomL730EvPmzaOoqIjc3FymT5/OzJkzMQwj7N9bEYkM9dyIyHFlZmbicrkAePjhhykoKMDv99OlSxcefvhhbrvtNhwOBzNnzuSDDz5gypQp3HHHHRQWFjJr1qzmE4cPt3LlSn76059SVFTErFmzuPrqq3nrrbeYPXv2cetxOBykp6cD4PP5mm+vqanhpZdeYtasWYwaNeqIzwsGg/z4xz/mjTfeYNy4cdx5553s27eP22+/vTm8zZ07l4cffhi3280vfvELRowYweOPP87zzz9/Ut87EbGGRm5E5LhcLhdz5szhd7/7He+88w7vvPMOKSkpjBw5kkmTJnHttdficrl4+OGHAejZsyeBQID8/HwWLVrEN998w5QpU4543JdeeolAIMCMGTO44oorAFi/fj2ffvopxcXFh4yUlJWV4XK58Hg8fPDBBxQWFpKRkcHo0aOpqqoCQkHn7rvv5uyzzwZCDcUtff7556xdu5Zu3brxxBNPYBgGgwcPZsGCBRQXF3PWWWfxt7/9DYA5c+bQu3dvpkyZwtKlS3nllVe45ZZbwv69FZHIULgRkRP6wQ9+wLnnnsv777/PypUrKSgoYMWKFaxYsYI33niDN954gxUrVvD8889TWVl5yOfW1NQc9TG3bNkCwGOPPcZjjz12yH2FhYX07du3+e8XXnjhIfd37tyZ3//+92RlZTWHG4ChQ4ce82v49ttvARg0aFBzcBo/fnzztFlZWRkVFRXNX29LdXV1eDye5qkxEYltCjci0iq9evXi1ltv5dZbbyUYDPLxxx9z1113sXnzZhYtWsRjjz1GRkYGv/rVr+jatSsvvPACX3755Qkf9yc/+Qljx4495LbBgwfj9Xqb//7MM8/gcDiw2Wzk5uYyaNAg7Hb7EY+Vmpp6zOdpmlozTfOENf3pT38iIyPjkNvUcyMSP9RzIyLHtXjxYmbMmMH999/ffJvNZmPSpEn07NkTgJKSEgDOOOMMpk+fzoQJEygvLweOHSYGDBgAgNPp5LzzzuO8884jKyuLzMxMsrKyDvnYc845h/POO48JEyYwdOjQowabExk4cCAQGsEJBoMAfPrpp3z/+9/n8ccfp3379rRr1w6AvLw8zjvvPM4991wA2rdv3xyORCT2aeRGRI5rwIABbNy4keXLl1NWVsa4ceOw2Wx89dVXbNmyhQ4dOtCxY0cA8vPzefHFF1mxYkXzFM67777bHCxauvHGG1m4cCHPPfccwWAQr9fL3/72N7p168bbb78d9q/jrLPOYsSIEaxZs4Y77riD008/nb/97W/s2bOHn/70pxiGwYwZM/jzn//Mvffey/XXX8/69ev597//zZVXXskf/vCHsNckIpGhcCMix9WjRw9ef/11nnvuOT777DOWLFmCYRjN+8jMmjWLLl26sG7dOhYsWMDcuXO55pprePjhh5kxYwZfffUVa9euPeJxzzjjDJ5++mnmzp3b3Mh70UUXMWfOnIj0thiGwQsvvMAjjzzCRx99xLJly+jXrx/33Xcf5513HhCaInM4HCxYsIA///nPZGZm8uMf/5if/exnYa9HRCLHMFszAS0iIiISJ9RzIyIiIglF4UZEREQSisKNiIiIJBSFGxEREUkoCjciIiKSUBRuREREJKEo3IiIiEhCUbgRERGRhKJwIyIiIglF4UZEREQSisKNiIiIJJT/D12NFbKo/XJnAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(dpi=90)\n",
    "ax = sns.distplot(y, kde=True, hist=False)\n",
    "ax = sns.distplot(X[\"Count\"], color='r', ax=ax, hist=True, kde=False, norm_hist=True)\n",
    "ax.set_xlabel(\"SalePrice\");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65f9c1f1",
   "metadata": {
    "papermill": {
     "duration": 0.006735,
     "end_time": "2025-03-19T15:03:42.713977",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.707242",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "And the distributions are almost exactly the same, too.\n",
    "\n",
    "# 3) Overfitting with Target Encoders\n",
    "\n",
    "Based on your understanding of how mean-encoding works, can you explain how XGBoost was able to get an almost a perfect fit after mean-encoding the count feature?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f3d97cb3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:42.728932Z",
     "iopub.status.busy": "2025-03-19T15:03:42.728613Z",
     "iopub.status.idle": "2025-03-19T15:03:42.735145Z",
     "shell.execute_reply": "2025-03-19T15:03:42.734382Z"
    },
    "lines_to_next_cell": 0,
    "papermill": {
     "duration": 0.015775,
     "end_time": "2025-03-19T15:03:42.736682",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.720907",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"outcomeType\": 1, \"valueTowardsCompletion\": 0.3333333333333333, \"interactionType\": 1, \"questionType\": 4, \"questionId\": \"3_Q3\", \"learnToolsVersion\": \"0.3.4\", \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\"}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc33\">Correct:</span> \n",
       "\n",
       "\n",
       "Since `Count` never has any duplicate values, the mean-encoded `Count` is essentially an exact copy of the target. In other words, mean-encoding turned a completely meaningless feature into a perfect feature.\n",
       "\n",
       "Now, the only reason this worked is because we trained XGBoost on the same set we used to train the encoder. If we had used a hold-out set instead, none of this \"fake\" encoding would have transferred to the training data.\n",
       "\n",
       "The lesson is that when using a target encoder it's very important to use separate data sets for training the encoder and training the model. Otherwise the results can be very disappointing!\n"
      ],
      "text/plain": [
       "Correct: \n",
       "\n",
       "\n",
       "Since `Count` never has any duplicate values, the mean-encoded `Count` is essentially an exact copy of the target. In other words, mean-encoding turned a completely meaningless feature into a perfect feature.\n",
       "\n",
       "Now, the only reason this worked is because we trained XGBoost on the same set we used to train the encoder. If we had used a hold-out set instead, none of this \"fake\" encoding would have transferred to the training data.\n",
       "\n",
       "The lesson is that when using a target encoder it's very important to use separate data sets for training the encoder and training the model. Otherwise the results can be very disappointing!"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# View the solution (Run this cell to receive credit!)\n",
    "q_3.check()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b38b185b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-19T15:03:42.752134Z",
     "iopub.status.busy": "2025-03-19T15:03:42.751845Z",
     "iopub.status.idle": "2025-03-19T15:03:42.758190Z",
     "shell.execute_reply": "2025-03-19T15:03:42.757290Z"
    },
    "papermill": {
     "duration": 0.015643,
     "end_time": "2025-03-19T15:03:42.759626",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.743983",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"interactionType\": 2, \"questionType\": 4, \"questionId\": \"3_Q3\", \"learnToolsVersion\": \"0.3.4\", \"valueTowardsCompletion\": 0.0, \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\", \"outcomeType\": 4}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#3366cc\">Hint:</span> \n",
       "Suppose you had a dataset like:\n",
       "\n",
       "| Count | Target |\n",
       "|-------|--------|\n",
       "| 0     | 10     |\n",
       "| 1     | 5      |\n",
       "| 2     | 30     |\n",
       "| 3     | 22     |\n",
       "\n",
       "What is the mean value of Target when Count is equal to 0? It's 10, since 0 only occurs in the first row. So what would be the result of mean-encoding Count, knowing that Count never has any duplicate values?\n"
      ],
      "text/plain": [
       "Hint: \n",
       "Suppose you had a dataset like:\n",
       "\n",
       "| Count | Target |\n",
       "|-------|--------|\n",
       "| 0     | 10     |\n",
       "| 1     | 5      |\n",
       "| 2     | 30     |\n",
       "| 3     | 22     |\n",
       "\n",
       "What is the mean value of Target when Count is equal to 0? It's 10, since 0 only occurs in the first row. So what would be the result of mean-encoding Count, knowing that Count never has any duplicate values?"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Uncomment this if you'd like a hint before seeing the answer\n",
    "q_3.hint()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0890450",
   "metadata": {
    "papermill": {
     "duration": 0.007202,
     "end_time": "2025-03-19T15:03:42.774526",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.767324",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# The End #\n",
    "\n",
    "That's it for *Feature Engineering*! We hope you enjoyed your time with us.\n",
    "\n",
    "Now, are you ready to try out your new skills? Now would be a great time to join our [Housing Prices](https://www.kaggle.com/c/house-prices-advanced-regression-techniques) Getting Started competition. We've even prepared a [Bonus Lesson](https://www.kaggle.com/ryanholbrook/feature-engineering-for-house-prices) that collects all the work we've done together into a starter notebook.\n",
    "\n",
    "# References #\n",
    "Here are some great resources you might like to consult for more information. They all played a part in shaping this course:\n",
    "- *The Art of Feature Engineering*, a book by Pablo Duboue.\n",
    "- *An Empirical Analysis of Feature Engineering for Predictive Modeling*, an article by Jeff Heaton.\n",
    "- *Feature Engineering for Machine Learning*, a book by Alice Zheng and Amanda Casari. The tutorial on clustering was inspired by this excellent book.\n",
    "- *Feature Engineering and Selection*, a book by Max Kuhn and Kjell Johnson."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30d6b96c",
   "metadata": {
    "papermill": {
     "duration": 0.007145,
     "end_time": "2025-03-19T15:03:42.789135",
     "exception": false,
     "start_time": "2025-03-19T15:03:42.781990",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "---\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "*Have questions or comments? Visit the [course discussion forum](https://www.kaggle.com/learn/feature-engineering/discussion) to chat with other learners.*"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "formats": "ipynb"
  },
  "kaggle": {
   "accelerator": "none",
   "dataSources": [
    {
     "datasetId": 933090,
     "sourceId": 1828856,
     "sourceType": "datasetVersion"
    }
   ],
   "isGpuEnabled": false,
   "isInternetEnabled": false,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 13.402383,
   "end_time": "2025-03-19T15:03:43.516059",
   "environment_variables": {},
   "exception": null,
   "input_path": "__notebook__.ipynb",
   "output_path": "__notebook__.ipynb",
   "parameters": {},
   "start_time": "2025-03-19T15:03:30.113676",
   "version": "2.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
